package juc.aqs;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/*
* jdk读写锁
* 特点：可以降级（重入） 不能升级（重入）
*      不支持条件变量
* */
public class Test2 {
    public static void main(String[] args) {

    }
}
class Case{
    Object data;
    volatile boolean cacheValid;
    final ReentrantReadWriteLock rwLock=new ReentrantReadWriteLock();

    public Object getCache(){
        //获取读锁
        rwLock.readLock().lock();
        if(!cacheValid){
            //重铸缓存
            ////释放读锁 加写锁(不支持读锁到写锁的重入)
            rwLock.readLock().unlock();
            rwLock.writeLock().lock();
            try {
                if(!cacheValid){
                    System.out.println("重铸缓存...");
                    cacheValid=true;
                }
                //将写锁降级为读锁 便于其他线程读取 提高并发度
                rwLock.readLock().lock();
            } finally {
                rwLock.writeLock().unlock();
            }

        }
        try {
            //获得缓存数据进行操作
            return data;
        } finally {
            //释放读锁
            rwLock.readLock().unlock();
        }
    }
}
